package com.tbit.main.service;

import com.tbit.main.pojo.*;
import com.tbit.main.pojo.VO.BatchMoveMachineReqVO;
import com.tbit.main.pojo.VO.MachineVO;
import com.tbit.main.pojo.VO.PutMachineRespVO;
import com.tbit.main.pojo.VO.PutMachineReqVO;
import com.tbit.main.pojo.dto.CheckMachineDTO;
import com.tbit.main.pojo.dto.ImportMachineDTO;

import javax.validation.Valid;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 设备service
 *
 * @author Leon
 * 2019年11月9日 下午4:08:03
 */
public interface MachineService {

    /**
     * 根据设备编号查询
     *
     * @param machineNO
     * @return
     */
    Machine getByMachineNO(String machineNO);

    Machine getFLM(String frame, String license, String motor);

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    Machine getByMachineId(Integer machineId);

    /**
     * 根据停车点id查询
     *
     * @param parkPointId
     * @return
     */
    List<Machine> getByParkPointId(Integer parkPointId);


    /**
     * 根据代理商id查询
     *
     * @param accountId
     * @return
     */
    List<Machine> getByAccountId(Integer accountId);

    /**
     * 根据代理商id分页查询
     *
     * @param accountId
     * @return
     */
    List<MachineVO> getByAccountIdPag(Integer accountId, Integer machineType, Integer pageNO, Integer rowCount,
                                      Integer functionType, Integer mapType, Integer machineStatusType);

    /**
     * 查询代理商投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByAccountId(Integer accountId);

    /**
     * 查询代理商,车辆类型投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByAccountIdType(Integer accountId, Integer machineType, Integer function, Integer machineStatusType);

    /**
     * 查询代理商投放车辆总数
     *
     * @param accountId
     * @return
     */
    List<Map<String, Object>> getCountByAccountIds(List<Integer> accountId);

    /**
     * 修改车辆状态
     *
     * @param machineId
     * @param state
     */
    void changeState(Integer machineId, Integer state);

    /**
     * 根据车辆id批量查询
     *
     * @param machineIds
     * @return
     */
    List<Machine> getByMachineIds(List<Integer> machineIds);

    /**
     * 根据车辆id批量查询
     *
     * @param machineIds
     * @return
     */
    List<Machine> getByMachineIdsAll(List<Integer> machineIds);

    /**
     * 根据设备编号批量查询
     *
     * @param machineNOs
     * @return
     */
    List<Machine> getByMachineNOs(List<String> machineNOs);

    /**
     * 投放
     *
     * @param parkMachine
     */
    void put(ParkMachine parkMachine);

    /**
     * 投放
     *
     * @param parkMachine
     */
    void putMachine(ParkMachine parkMachine);

    /**
     * 取消投放
     *
     * @param machineId
     */
    void recovery(Integer machineId);

    /**
     * 根据车辆id查询站点
     *
     * @param machineId
     * @return
     */
    ParkMachine getParkId(Integer machineId);

    /**
     * 查询闲置车辆
     *
     * @param accountId
     * @param lastBorrowTime
     * @return
     */
    List<Machine> getUnUseByAccountId(Integer accountId, String lastBorrowTime);

    /**
     * 设备权限判断
     *
     * @param agents
     * @param machineId
     */
    void auth(List<Agent> agents, Integer machineId);

    /**
     * 设备权限判断,修改无权限为车辆不存在
     *
     * @param
     * @param machineId
     */
    void authCheck(AccountUser accountUser, String machineId,Integer accountId);

    /**
     * 设备权限判断
     *
     * @param agents
     * @param machine
     */
    void auth(List<Agent> agents, Machine machine);

    Boolean auth(Integer accountId);

    void auth(Machine machine);

    List<String> authBatch(List<Machine> machines);

    /**
     * 获取设备信息
     *
     * @param machineId
     * @return
     */
    MachineInfo getMachineInfo(Integer machineId) throws ParseException;

    /**
     * 查询临时停车信息
     *
     * @param machineId
     * @return
     */
    Park getParkByMachineId(Integer machineId);

    /**
     * 获取骑行中的设备
     *
     * @param accountId
     * @return
     */
    List<Machine> getUseingByAccountId(Integer accountId);

    /**
     * 获取骑行中的设备
     *
     * @param regionId
     * @return
     */
    List<Machine> getUseingByRegionId(List<Integer> regionId);


    /**
     * 获取骑行中的设备
     *
     * @param accountId
     * @return
     */
    List<Machine> getUseingByAccountIds(List<Integer> accountId);

    /**
     * 获取骑行中的设备id
     *
     * @param accountId
     * @return
     */
    List<Integer> getUseingIdsByAccountIds(List<Integer> accountId);

    /**
     * 查询所有设备
     *
     * @return
     */
    List<Machine> getAll();

    /**
     * 查找所有投放车辆
     *
     * @return
     */
    List<Machine> getState(List<Integer> accountIds);

    /**
     * 根据用户码查询车辆
     *
     * @param userCode
     * @return
     */
    Machine getByUseCode(String userCode);

    /**
     * 根据用户码批量查询
     *
     * @param userCodes
     * @return
     */
    List<Machine> getByUserCodes(List<String> userCodes);

    /**
     * 根据用户码和区域批量查询
     */
    List<Machine> getByUserCodesAndAccountId(List<String> userCodes, Integer accountId);

    /**
     * 根据运营区域id批量查询
     *
     * @param accountIds
     * @return
     */
    List<Machine> getByAccountIds(List<Integer> accountIds);

    /**
     * 绑定信息修改
     *
     * @param machineId
     * @param userCode
     * @param machineNO
     */
    void boundUpdate(Integer machineId, String userCode, String machineNO, String frame, String license, String motor, String remark);

    /**
     * 更新最后借出时间
     *
     * @param machineId
     */
    void updateLastBorrowTime(Integer machineId);

    /**
     * 获取无订单无占用未锁车辆
     *
     * @return
     */
    List<Machine> getUnLock(List<String> machineNOs);

    /**
     * 查询品牌投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByBrand(Integer accountId);

    /**
     * 查询运营区域批量投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByBrandByAccountId(List<Integer> accountId);

    /**
     * 占用查询
     *
     * @param machineId
     * @return
     */
    Integer getOccupy(Integer machineId);

    /**
     * 根据运营区域查询车辆编号
     *
     * @param accountId
     * @return
     */
    List<String> getAccountIdMachine(Integer accountId);

    /**
     * 根据时间和运营区域查询车辆总数
     *
     * @param accountId
     * @param date
     * @return
     */
    Integer getByAccountDate(Integer accountId, String date);

    /**
     * @param accountIds 根据运营区域,获取车辆数
     * @return
     */
    List<Map<String, Object>> getGroupByDay(List<Integer> accountIds);

    /**
     * 获取运营区域内的车辆数
     *
     * @return
     */
    List<Map<String, Object>> getGroupByAccountId();

    /**
     * 根据站点，查询车辆总数
     *
     * @param parkPointId
     * @return
     */
    Integer getByParkPointIds(Integer parkPointId);

    /**
     * 根据运营区域和车辆状态查询
     *
     * @param accountId
     * @param state
     * @return
     */
    Integer getByAccountIdType(Integer accountId, Integer state);

    /**
     * 根据运营区域Id和状态查询设备
     * @param accountId 运营区域Id
     * @param state 状态
     * @return 设备列表
     */
    List<Machine> selectMachineListByAccountIdAndState(Integer accountId, Integer state);

    /**
     * 根据分区Id和状态查询设备
     * @param regionId 分区Id
     * @param state 状态
     * @return 设备列表
     */
    List<Machine> selectMachineListByRegionIdAndState(Integer regionId, Integer state);

    /**
     * 根据分区和车辆状态查询
     *
     * @param regionId
     * @param state
     * @return
     */
    Integer getByRegionIdType(Integer regionId, Integer state);

    /**
     * 根据设备编号，批量获取设备id
     *
     * @param machineNOs
     * @return
     */
    List<Integer> getMachineIdByNOs(List<String> machineNOs, Integer machineType);

    /**
     * 根据设备id，批量获取设备编号
     *
     * @param machineIds
     * @return
     */
    List<String> getMachineNOByIds(List<Integer> machineIds, Integer machineType);

    /**
     * 根据设备编号获取车辆编号
     *
     * @param machineNos
     * @return
     */
    List<String> getUserCodeByMachineNo(List<String> machineNos);

    /**
     * 根据时间查询区域车辆数
     *
     * @param lastBorrowTime
     * @return
     */
    List<Map<String, Object>> getAccountLast(String lastBorrowTime);

    /**
     * 查询时间段内的新增车辆数
     *
     * @param startTime
     * @param endTime
     * @param count
     * @return
     */
    List<Map<String, Object>> getAccountEvent(String startTime, String endTime, Integer count);

    /**
     * 修改站点车辆。
     *
     * @param machineId
     * @param inside
     */
    Integer parkMachineInside(Integer machineId, Integer parkPointId, Integer inside);

    /**
     * 获取设备是否闲置
     *
     * @param list
     * @param lastBorrowTime
     * @return
     */
    List<Integer> getExist(List<Integer> list, String lastBorrowTime);

    Machine getByUseCodeAndAccountId(String userCode, Integer accountId);

    void changeStateBatch(List<String> userCodeS);

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    String getByMachineIdTag(Integer machineId);

    /**
     * 扫码或输入划拨的设备
     * @param reqVO 请求
     */
    List<PutMachineRespVO> putMachine(@Valid PutMachineReqVO reqVO);

    Map<String, String> checkMachine(List<String> userCodes, List<Machine> machines);

    /**
     * 批量划拨设备
     * @param reqVO 划拨的参数
     * @return 划拨结果
     */
    List<PutMachineRespVO> batchMoveMachine(@Valid BatchMoveMachineReqVO reqVO);

    /**
     * 划拨后清除车辆状态
     *
     * @param machineIdList 车辆id集合
     */
    void clearMachineStatus(List<Integer> machineIdList);

    /**
     * 校验设备
     * @param dto dto
     * @return Result<Object>
     */
    Result<Object> checkMachine(CheckMachineDTO dto);

    /**
     * 批量导入设备
     * @param dto dto
     * @return Result<List<String>>
     */
    Result<List<String>> importMachine(ImportMachineDTO dto, AccountUser account);

    /**
     * 根据车辆编号和设备状态类型查询车辆
     * @param userCode          车辆编号
     * @param machineStatusType 设备状态类型 0:闲置 1:骑行中 2:运维占用 3:异常
     */
    MachineVO getByUseCodeAndMachineStatus(String userCode, Integer machineStatusType);

    /**
     * @description: 获取车辆的异常、故障信息
     * @author: mo.shanyong
     * @date: 2025/4/11 16:34
     * @param: machineIdList 车辆id
     * @return: java.util.Map<java.lang.Integer, java.util.Map < java.lang.String, java.util.List < java.lang.Integer>>>
     */
    Map<Integer, Map<String, List<String>>> getMachineFaultAndAbnormal(List<Integer> machineIdList);

    /**
     * @description: 获取车辆全部信息包括最新的挪车、调度、换电、故障等
     * @author: mo.shanyong
     * @date: 2025/4/18 9:10
     * @param: machineId 车辆id
     * @return: com.tbit.main.pojo.MachineInfo
     */
    MachineInfo getMachineInfoV2(Integer machineId);

    /**
     * 更新最后一次还车时间
     *
     * @param machineNO      设备编号
     * @param lastReturnTime 最后一次还车时间
     */
    void updateLastReturnTime(String machineNO, Date lastReturnTime);

    /**
     * 根据车辆编号和运营区域id查询车辆
     * @param userCode 车辆编号
     * @param accountId 区域id
     * @return 车辆
     */
    Machine getByUserCodeAndAccountId(String userCode, Integer accountId);
}